//package com.gzist.elderlyserviceplatform.websocketserver;
//
//import com.gzist.elderlyserviceplatform.service.DeepSeekService;
//import lombok.RequiredArgsConstructor;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.web.bind.annotation.CrossOrigin;
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.concurrent.*;
//
//
///**
// * WebSocket服务器，用于处理用户之间的实时通信
// */
//@CrossOrigin(origins = "*")
//@Component
//@ServerEndpoint("/chat/{userId}")
//public class ChatWebSocketServer {
//
//    private static final Logger log = LoggerFactory.getLogger(ChatWebSocketServer.class);
//
//    // 心跳相关常量
//    private static final String HEARTBEAT_MESSAGE = "PING"; // 服务端发送的心跳消息
//    private static final long HEARTBEAT_INTERVAL = 30; // 心跳间隔时间（秒）
//    private static final long TIMEOUT = 60; // 客户端超时时间（秒）
//
//    // 线程池，用于定时发送心跳消息
//    private static final ScheduledExecutorService heartbeatExecutor = Executors.newScheduledThreadPool(20);
//
//    // 当前在线连接数
//    private static int onlineCount = 0;
//
//    // 存放每个客户端对应的WebSocketServer对象
//    private static ConcurrentHashMap<String, ChatWebSocketServer> webSocketMap = new ConcurrentHashMap<>();
//
//    // 当前客户端的连接会话
//    private Session session;
//
//    // 当前客户端的用户ID
//    private String userId = "";
//
//    // 上次接收到心跳消息的时间
//    private long lastHeartbeatTime = System.currentTimeMillis();
//
//    // 当前客户端的心跳任务引用
//    private ScheduledFuture<?> heartbeatTask;
//
//    // DeepSeek服务
//    private static DeepSeekService deepSeekService;
//
//    @Autowired
//    public void setDeepSeekService(DeepSeekService deepSeekService) {
//        ChatWebSocketServer.deepSeekService = deepSeekService;
//    }
//
//    /**
//     * 连接建立成功时调用
//     */
//    @OnOpen
//    public void onOpen(Session session, @PathParam("userId") String userId) {
//        this.session = session;
//        this.userId = userId;
//
//        // 如果用户已存在，先移除旧连接，再添加新连接
//        if (webSocketMap.containsKey(userId)) {
//            webSocketMap.remove(userId);
//        }
//        webSocketMap.put(userId, this);
//
//        addOnlineCount();
//        log.info("用户[{}]连接成功，当前在线人数为: {}", userId, getOnlineCount());
//
//        try {
//            sendMessage("连接成功");
//        } catch (IOException e) {
//            log.error("向用户[{}]发送连接成功消息时发生异常: {}", userId, e.getMessage());
//        }
//
//        // 启动心跳检测任务
//        startHeartbeat();
//    }
//
//    @OnClose
//    public void onClose() {
//        webSocketMap.remove(userId);
//        subOnlineCount();
//
//        // 取消心跳任务
//        if (heartbeatTask != null) {
//            heartbeatTask.cancel(false);
//        }
//
//        log.info("用户[{}]退出，当前在线人数为: {}", userId, getOnlineCount());
//    }
//
//    @OnMessage
//    public void onMessage(String message) {
//        log.info("收到用户[{}]的消息: {}", userId, message);
//
//        try {
//            // 如果收到心跳消息，更新最后心跳时间
//            if (HEARTBEAT_MESSAGE.equals(message)) {
//                this.lastHeartbeatTime = System.currentTimeMillis();
//                log.info("收到用户[{}]的心跳消息，更新最后心跳时间", userId);
//            } else {
//                // 调用 DeepSeekService 处理消息
//                deepSeekService.handleChatWebSocket(message, userId)
//                        .subscribe(
//                                response -> {
//                                    try {
//                                        if (session.isOpen()) {
//                                            session.getAsyncRemote().sendText(response);
//                                        }
//                                    } catch (Exception e) {
//                                        log.error("发送消息失败: {}", e.getMessage());
//                                    }
//                                },
//                                error -> {
//                                    try {
//                                        if (session.isOpen()) {
//                                            session.getAsyncRemote().sendText("Error: " + error.getMessage());
//                                        }
//                                    } catch (Exception e) {
//                                        log.error("发送错误消息失败: {}", e.getMessage());
//                                    }
//                                }
//                        );
//            }
//        } catch (Exception e) {
//            log.error("处理用户[{}]的消息时发生异常: {}", userId, e.getMessage());
//        }
//    }
//
//    private void startHeartbeat() {
//        if (heartbeatTask != null) {
//            heartbeatTask.cancel(false);
//        }
//
//        heartbeatTask = heartbeatExecutor.scheduleAtFixedRate(() -> {
//            long currentTime = System.currentTimeMillis();
//            if (currentTime - this.lastHeartbeatTime > TIMEOUT * 1000) {
//                log.warn("用户[{}]超时未响应心跳，关闭连接", userId);
//                try {
//                    session.close();
//                } catch (IOException e) {
//                    log.error("关闭用户[{}]的连接时发生异常: {}", userId, e.getMessage());
//                }
//                webSocketMap.remove(userId);
//                subOnlineCount();
//            } else {
//                try {
//                    sendMessage(HEARTBEAT_MESSAGE);
//                } catch (IOException e) {
//                    log.error("向用户[{}]发送心跳消息时发生异常: {}", userId, e.getMessage());
//                }
//            }
//        }, 0, HEARTBEAT_INTERVAL, TimeUnit.SECONDS);
//    }
//
//    public void sendMessage(String message) throws IOException {
//        session.getAsyncRemote().sendText(message);
//    }
//
//    public static synchronized int getOnlineCount() {
//        return onlineCount;
//    }
//
//    public static synchronized void addOnlineCount() {
//        onlineCount++;
//    }
//
//    public static synchronized void subOnlineCount() {
//        onlineCount--;
//    }
//}